#ifndef CONSTANTES_GLOBALS_H
#define	CONSTANTES_GLOBALS_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <time.h>        //para gettimeofday
#include <sys/time.h>    //para gettimeofday
#include <math.h>

#include "Processo.h"
#include "EstruturaDinamica.h"
#include "Funcoes.h"
#include "Install.h"
#include "Escalonamento.h"
#include "Memoria.h"
#include "Log.h"
#include "SA_operacoes.h"
#include "Mutex.h"
#include "Recurso.h"
#include "list_bloqueados.h"

/**------------------------------------------RECURSOS---------------------------------------**/
#define TAM_VET_RECURSO 3//quantidade de recursos disponiveis
#define TAM_MAX_REQUISTO_RECURSO 2//tamanho do vetor definido no typedef
Recurso *recurso;//definicao geral do typedef usa-se apenas uma vez

/**-------------------------------------------MUTEX----------------------------------------**/
int mutex; //0 significa região livre 
int pid_processo_regiao_critica;

/**-------------------------------------------USO GERAL----------------------------------------**/
/*
 * Para usar o ponteiro abaixo, deve-se acrecentar a seguinte instanciacao dentro da funcao principal
 * chamada.
 * 
 *                            fp = fopen("C:/log.txt","w"); 
 * 
 * Um exemplo com mais detalhe e o arquivo Memoria.c -> verificaImportanciaProcesso(Processo p)
 * 
 */
FILE* fp;
FILE *log_file;//log do escalonamento
FILE *log_dl;//log do deadlock

/**Arquivo que possui as constantes, variáveis globais e arquivos de cabeçalhos(.h) utilizados nos outros arquivos**/

/**------------------------------------------MEMÓRIA RAM---------------------------------------**/
/**
 * MEMORIA: ate 256 e espaco de Nucleo, a partir disso eh espaco de usuario
 * 
 * Define QTD: o vetor da memoria ira conter processos e tabelas de processos no nucleo 
 * Entao as primeiras QTD da memoria (vetor) ira ter processos e as outras QTD + QTD sera processos
 */
#define TAM_RAM 1024
#define TAM_VIRT 1024
#define INICIO_N 0
#define FIM_N 256
#define INICIO_U 257
#define FIM_U 1023
#define QTD 50

/**------------------------------------------PROCESSOS/ESCALONAMENTO---------------------------------------**/
#define TAM_INSTRUCOES 1000
#define TAM_MAX_PROCESSOS 200
#define FIM_OU_ERRO_FATAL 0
#define PRONTO 1
#define BLOQUEADO 2
#define EXECUTANDO 3
#define TEMP_LISTA 1


int tempo_para_novo_processo;//variavel usada para definir quanto tempo um novo processo ira ir para execucao
double inicio;
double fim;

/**
 * Processo em execução
 */
Processo* execucao;

/**
 * Lista de processos bloqueados para realizar escalonamento
 */
Estrutura* ed_processos_bloqueados;

/**
 * Fila de processos prontos para realizar escalonamento
 */
Estrutura* ed_processos_prontos;


/**
 * Lista de processos que irao ser inseridos na lista
 */
Estrutura* ed_novos_processos;



/**------------------------------------------TABELA DE PROCESSOS---------------------------------------**/
TabelaProcesso* tabela_processos[TAM_MAX_PROCESSOS];
int posicao_livre_tabela_processos;
#define QUANTUM 10


#endif	